#ifndef _VL_C_CONFIG_SUPPORT__H_
#define _VL_C_CONFIG_SUPPORT__H_

#include <cstdint>

#include "support/vl_support.h"
#include "vl_c_config_def.h"


/**
 * @Author: CimZzz
 * @Date: 2022-06-28 11:41:13
 * 
 * 跨平台兼容宏定义
 */
#if defined __APPLE__ || defined __MACH__
	#define VL_C_COMPILE_SYS_ROOT_KEY "-isysroot "
	#define VL_C_COMPILE_DYM_KEY "-shared"
	#define VL_C_COMPILE_DYM_POSTFIX_KEY ".dylib"
	#define VL_C_COMPILE_STATIC_POSTFIX_KEY ".a"
	#define VL_C_COMPILE_NOP_STATIC_POSTFIX_KEY ".nopa"
#elif defined __linux__ || defined __unix || defined __unix__
	#define VL_C_COMPILE_SYS_ROOT_KEY "--sysroot="
	#define VL_C_COMPILE_DYM_KEY "-shared"
	#define VL_C_COMPILE_DYM_POSTFIX_KEY ".so"
	#define VL_C_COMPILE_STATIC_POSTFIX_KEY ".a"
	#define VL_C_COMPILE_NOP_STATIC_POSTFIX_KEY ".nopa"
#elif defined _WIN32 || defined _WIN64
	#define VL_C_COMPILE_SYS_ROOT_KEY "--sysroot="
	#define VL_C_COMPILE_DYM_KEY "-shared"
	#define VL_C_COMPILE_DYM_POSTFIX_KEY ".dll"
	#define VL_C_COMPILE_STATIC_POSTFIX_KEY ".a"
	#define VL_C_COMPILE_NOP_STATIC_POSTFIX_KEY ".nopa"
#else
	#error Not support operator system!
#endif


namespace VL {

/**
 * @Author: CimZzz
 * @Date: 2022-08-19 15:30:21
 * 
 * C / C++ 配置操作支持
 */
class CConfigSupport: public VLSupport {
public:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 15:31:03
	 * 
	 * 构造函数
	 */
	explicit CConfigSupport();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 15:53:54
	 * 
	 * 执行动作
	 * 
	 * @param env 环境变量
	 */
	virtual void doAction(VLEnv* env);

private:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:35:25
	 * 
	 * 打印配置信息
	 * 
	 * @param configBundle 配置参数集合
	 */
	void printConfig(const CConfigBundle& configBundle);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 19:01:24
	 * 
	 * 为源文件池生成源文件指针
	 * 
	 * @param srcDir 源文件目录
	 * @param validDir 源文件校验文件目录
	 * @param fileKey 文件键值
	 * @param isTestFile 判断是否为测试用例中的源文件
	 * 
	 * @return 源文件指针
	 */
	std::shared_ptr<FileWrapper> makeSourceFilePtr(const VLFile& srcDir, const VLFile& validDir, const std::string& fileKey, bool isTestFile = false);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 19:24:33
	 * 
	 * 为目标文件池生成目标文件指针
	 * 
	 * @param isForDynamic 是否作为动态链接库的目标文件
	 * @param srcDir 目标文件目录
	 * @param validDir 目标文件校验文件目录
	 * @param fileKey 文件键值
	 * @param sourceFilePtr 源文件指针
	 * @param isTestTarget 是否为测试目标文件
	 * 
	 * @return 目标文件指针
	 */
	std::shared_ptr<FileWrapper> makeTargetFilePtr(
		bool isForDynamic,
		const VLFile& targetDir,
		const VLFile& validDir, 
		const std::string& fileKey,
		const std::shared_ptr<FileWrapper>& sourceFilePtr,
		bool isTestTarget = false
	);
	
	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 19:42:10
	 * 
	 * 生成可执行文件指针
	 * 
	 * @param installDir 可执行文件安装目录
	 * @param validDir 可执行文件校验文件目录
	 * @param fileName 可执行文件名
	 * @param isTestFile 判断是否为测试用例中的可执行文件
	 * 
	 * @return 可执行文件指针
	 */
	std::shared_ptr<FileWrapper> makeExecutableFilePtr(
		const VLFile& installDir,
		const VLFile& validDir,
		const std::string& fileName,
		bool isTestFile = false
	);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-20 16:43:21
	 * 
	 * 生成头文件指针
	 * 
	 * @param installDir 头文件安装目录
	 * @param fileName 头文件名
	 * 
	 * @return 头文件指针
	 */
	std::shared_ptr<FileWrapper> makeHeaderFilePtr (
		const VLFile& installDir,
		const std::string& fileName
	);


	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 19:42:10
	 * 
	 * 生成库文件指针
	 * 
	 * @param libFlags 库标志 0 - 动态库, 1 - 静态库, 2 - 位置无关静态库
	 * @param installDir 库文件安装目录
	 * @param validDir 库文件校验文件目录
	 * @param fileName 库文件名
	 * 
	 * @return 库文件指针
	 */
	std::shared_ptr<FileWrapper> makeLibraryFilePtr(
		uint8_t libFlags,
		const VLFile& installDir,
		const VLFile& validDir,
		const std::string& fileName
	);

};

}

#endif // _VL_C_CONFIG_SUPPORT__H_
